Skip to main content

Windows 下编译 Redis,版本使用目前最新的 7.0

原文地址 lgq51233.xyz

Windows 下编译 Redis,版本使用目前最新的 7.0。

前言

最近 Redis 更新了 7.0 了,但是官方还是没有支持 windows。有时想在 windows 下使用还是不太方便,所以就研究了下在 windows 编译 redis。当然,如果不想自己捣鼓,可以去 github 找编译好的,比如 redis-windows 这个。

官方不支持 Windows,就意味着不能正常使用msvc进行编译,所以只能选择使用 Cygwin 或者 MSYS2 进行编译。

需要注意的是,无论使用 Cygwin 编译还是 MSYS2 编译,都依赖Cygwin或者MSYS2的库,都是经过转换,会有一定的性能损失。不过基本开发使用是没有问题的。

使用 Cygwin 编译

# 安装需要的依赖 gcc-core gcc-g++ make tcl wget
.\setup-x86_64.exe -q -P gcc-core -P make -P gcc-g++ -P tcl -P wget
# 下载源码
wget https://download.redis.io/redis-stable.tar.gz
# 解压
tar -zxvf redis-stable.tar.gz
cd redis-stable
# 编译
make clean
make PREFIX=/cygdrive/f/Tools/redis-7.0 install


编译完成之后,就可以在目录下看到编译好的执行文件了。

注意:如果想要在 windows 直接运行,而不是进入 cygwin 环境运行,需要把 cygwin1.dll 库也复制到当前目录下,否则会运行不了。这个库可以在 cygwin 安装目录的 bin 目录下找到。相关配置文件可以到源码根目录下找到,比如:redis.confsentinel.conf

启动,可以使用,并且可以连接,添加数据。

使用 MSYS2 编译

安装 MSYS2,使用 scoop 直接安装即可,scoop install msys2,关于 scoop 的详细使用方法,可以参考 scoop

# 更新源
pacman -Sy
# 安装环境
pacman -S make pkg-config gcc python
# 下载源码
wget https://download.redis.io/redis-stable.tar.gz
# 解压
tar -zxvf redis-stable.tar.gz
cd redis-stable
# 编译
make
make PREFIX=/f/Tools/redis-7.0-MSYS2 install


遇到的错误

如果直接编译的话,因为是在 windows 平台,所以编译条件不满足的话,会漏引入Dl_info结构体。

修改 usr/include/dlfcn.h 头文件。

把以下条件编译注释掉

修改后再次编译即可。看到以下的就说明编译成功了。

注意:和使用cygwin一样,如果想要在 windows 直接运行,而不是进入 msys2 环境运行,需要把 msys-2.0.dll 库也复制到当前目录下,否则会运行不了。这个库可以在 msys2 安装目录的 usr/bin 目录下能找到。

最后运行,也没有问题。

创建为 Windows 服务

方式一:自己编写服务

参考 redis-windows

创建一个C#控制台项目

通过nuget添加Microsoft.Windows.Compatibility依赖。

编写代码。

using System.Diagnostics;
using System.ServiceProcess;

namespace redis_windows_service
{
static class Program
{
[System.Diagnostics.CodeAnalysis.SuppressMessage("Interoperability", "CA1416:验证平台兼容性",
Justification = "<挂起>")]
static void Main()
{
ServiceBase.Run(new RedisService());
}
}

partial class RedisService : ServiceBase
{
private Process? process = new();

protected override void OnStart(string[] args)
{
var basePath = Path.Combine(AppContext.BaseDirectory).Replace("\\", "/");



var confPath = "./";
ProcessStartInfo processStartInfo =
new(basePath + "redis-server.exe", confPath + "redis.conf")
{
WorkingDirectory = basePath
};
process = Process.Start(processStartInfo);
}

protected override void OnStop()
{
if (process != null)
{
process.Kill();
process.Dispose();
}
}
}
}


发布程序,打包成单文件。

发布成功。

最终生成有 3 个文件。

把三个文件和编译好的 redis 文件放在一起,最终目录结构如下:

管理员启动终端。

# 添加到服务
# 如果需要开机启动的,后面添加 start= auto 参数
sc.exe create redis binpath=F:\WorkSpace\ServerSoft\redis-7.0-MSYS2\redis-windows-service.exe
# 删除服务
sc.exe delete redis
# 启动redis服务
sudo net start redis
# 停止服务
sudo net stop redis


简单测试下,可以使用。

方式二:通过 WinSW 创建

winsw 是一个可以把 Windows 应用打包成 Windows 服务的开源应用。

去 release 界面下载执行文件和配置文件,一个是sample-minimal.xml,一个是WinSW-x64.exe

把这 2 个文件复制到 redis 目录下面,并都修改名字为RedisService,如下图:

修改RedisService.xml配置文件。

<service>
<service>
<id>redis</id>
<name>redis-7.0</name>
<description>Redis 7.0</description>
<executable>F:/Tools/redis-7.0-MSYS2/bin/redis-server.exe</executable>
<logpath>F:/Tools/redis-7.0-MSYS2/bin//logs</logpath>
<logmode>roll</logmode>
</service>
</service>


命令行进入该目录,执行安装指令。

# 安装
RedisService.exe install RedisService.xml
# 启动
RedisService.exe start RedisService.xml
# 查看状态
RedisService.exe status RedisService.xml
# 卸载
RedisService.exe uninstall RedisService.xml


安装成功后,之后的使用方式和上一种方式是一样的,这里就不重复了。